package code19_jdk8.lambda;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Comparator;
import java.util.List;
import java.util.function.Consumer;
import java.util.function.Supplier;

public class Test02 {

	public static void main(String[] args) {
		// 方法引用
		List<Car> list = new ArrayList<Car>();
		for (int i = 0; i < 3; i++) {
//			Car car = Car.create(new Supplier<Car>() {
//				@Override
//				public Car get() {
//					return new Car();
//				}
//			});
			// 无参数, 返回创建好的对象
			//Car car = Car.create( () -> new Car() );
			// 1.构造方法引用, 语法  类名::new
			Car car = Car.create( Car::new );
			list.add(car);
		}
		System.out.println(list);
		System.out.println("-------------");
		
//		list.forEach(new Consumer<Car>() {
//			@Override
//			public void accept(Car t) {
//				System.out.println(t);
//			}
//		});
		
		// 2.静态方法引用, 语法 类名::静态方法名
		//list.forEach( car -> Car.fun2(car) );
		list.forEach( Car::fun2 );
		System.out.println("---------------");
		// 3.特定类的 对象的方法引用(方法无参数), 语法 类名::对象方法名(非静态方法)
		list.forEach( car -> car.fun1() );
		list.forEach( Car::fun1 );// 使用参数调用对应的方法
		System.out.println("---------------");
		
		// 4.特定对象的方法引用 ( 有且仅有一个参数 ), 语法 对象名::对象方法名(非静态方法)
		Car car = new Car();
		// list.forEach( c -> car.fun3(c) );
		list.forEach( car::fun3 );
		//list.forEach( (car) -> System.out.println(car) );
		list.forEach( System.out::println );
		
		t1();
	}
	
	public static void t1() {
		Character[] arr = {'z', 'f', 's', 'c', 't'};
		// 使用 方法的引用简化写法
		Arrays.sort(arr, new Comparator<Character>() {
			@Override
			public int compare(Character c1, Character c2) {
				return Character.compare(c1, c2);
			}
		});
		// Lambda
		// Arrays.sort(arr, (c1, c2) -> Character.compare(c1, c2) );
		// 方法引用
		Arrays.sort(arr, Character::compare );
		System.out.println(Arrays.toString(arr));
	}
}

class Car {
	public void fun1() {
		System.out.println("fun1:" + this.toString());
	}
	public static void fun2(Car car) {
		System.out.println("fun2:" + car.toString());
	}
	public void fun3(Car car) {
		System.out.println("fun3:" + car.toString());
	}
	public Car() {
	}
	// Supplier 接口
	public static Car create(Supplier<Car> supplier) {
		return supplier.get();
	}
}